package intranet.client;


import java.util.Date;
import java.util.HashMap;
import java.util.Vector;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.i18n.client.DateTimeFormat;

import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.datepicker.client.DateBox;

/**
 * @author AHMIM Ahmed
 *
 */




public class Calendaradd {
	VerticalPanel Panel,vPanel,vPanel2,vPanel3 ;
	HorizontalPanel hPanel1,hPanel2,hPanel3,hPanel4,hPanel4C;
	DateBox dateBox ;
	Label titre,date,lcontenu;	
	Button partage,confirmer,annuler,confirmerC,annulerC;
	PushButton add,sup;
	ValidTextBox intituleven;
	ValidTextArea contenu;
	protected ListBox liste1,liste2;
	Session session;
	DataBaseServiceAsync dataBaseService = GWT.create(DataBaseService.class);
	String requet,requet1,res ;
	Vector<String> v1,v2; 
	String eventid;
	int x=0;
	Calendarconsult calConsult;
	
	
	/**
	 * Cette méthode représente le constructeur de la classe calendaradd  
	 * @param sees  la session courante ,calCon la partie Calendarconsult de notre Calendar 
	 * 
	 */		
	Calendaradd(Session sess,Calendarconsult calCon)
	{
		this.session=sess;
	    this.calConsult=calCon;
		hPanel1=new HorizontalPanel();
		hPanel2=new HorizontalPanel();
		hPanel3=new HorizontalPanel();
		hPanel4=new HorizontalPanel();
		hPanel4C=new HorizontalPanel();
		titre= new Label("Intitulé : ");
		date=new Label("Date début : ");
		lcontenu=new Label("Contenu d'évenement:");
		vPanel= new VerticalPanel();
		dateBox = new DateBox();
		dateBox.setFormat(new DateBox.DefaultFormat(DateTimeFormat.getFormat("dd/MM/yyyy"))); 
		dateBox.setSize("90px", "20px");
		intituleven = new ValidTextBox();
		intituleven.setSize("130px", "20px");
		hPanel1.add(titre);
		hPanel1.add(intituleven);
		hPanel2.add(date);
		hPanel2.add(dateBox);		
		vPanel.add(hPanel1);
		vPanel.add(hPanel2);
		contenu = new ValidTextArea();
		contenu.setSize("200px","100px");
		vPanel.add(lcontenu);
		vPanel.add(contenu);
	    partage= new Button("Partager l'évenement");
	    vPanel.add(partage);
	    liste1=new ListBox(true);
	    liste2=new ListBox(true);
	    
	    
	    liste1.setVisibleItemCount(5);

	    liste1.setSize("80px","120px");
	    
	    liste2.setVisibleItemCount(5);

	    liste2.setSize("80px","120px");
	    
	    vPanel2= new VerticalPanel();
	    vPanel3= new VerticalPanel();
	    

	    
		add=new PushButton(new Image("add.png"));
		add.setSize("22px", "22px");
		
		sup=new PushButton(new Image("delete.png"));
		sup.setSize("22px", "22px");
		
	    confirmerC= new Button("Confirmer");

	    
	    annulerC= new Button("Réinitialiser");

	    
	    confirmer= new Button("OK");

	    
	    annuler= new Button("Annuler");

	    
	    
	    vPanel2.add(add);
	    vPanel2.add(sup);
	    
	    hPanel3.add(liste1);
	    hPanel3.add(vPanel2);
	    hPanel3.add(liste2);
	    
	    vPanel3.setVisible(false);
	    
	    hPanel4C.add(annulerC);
	    hPanel4C.add(confirmerC);
	    
	    
	    hPanel4.add(annuler);
	    hPanel4.add(confirmer);
	    
	    vPanel3.add(hPanel3);
	    vPanel3.add(hPanel4);
	    vPanel.add(hPanel4C);
	    
	    Panel= new VerticalPanel();
	    Panel.add(vPanel);
	    Panel.add(vPanel3);
	    
	    
	   v1=new Vector<String>();
	   v2=new Vector<String>();
	    
	    
//Ajouter un événement au bouton partager afin d’afficher la liste des enseignants auxquels je veux partager l’événement	    
	    partage.addClickHandler(new ClickHandler()
		{
			public void onClick(ClickEvent event)
			{
	        	if(x==0){x++;addselectedteacher();}
	        	vPanel.setVisible(false);
	        	vPanel3.setVisible(true);
			      
			      
	        }
	      });
	   
//Ajouter un événement associer au champ du text intituler d’événement  afin de vérifier que le champs et vide ou non

 intituleven.addKeyUpHandler(new KeyUpHandler()
		{
			public void onKeyUp(KeyUpEvent event)
			{
				if (!intituleven.getText().equals(""))				
					intituleven.removeStyleName("error");	
				else intituleven.setStyleName("error");	
			}
		});	 
	    
//Ajouter un événement associé au champ de la date afin de vérifier si la date écrite est une date au format dd/yy/MMMM ou non   
	    dateBox.getTextBox().addKeyUpHandler(new KeyUpHandler()
		{
			public void onKeyUp(KeyUpEvent event)
			{
				if (dateBox.getTextBox().getText().equals(""))				
					dateBox.getDatePicker().setValue(null);		
			}
		});	 
  
// Enlever le style d’erreur après l’ajout d’une date par le composant DatePicker de DateBOX
dateBox.getDatePicker().addValueChangeHandler(new ValueChangeHandler<Date>() {
    public void onValueChange(ValueChangeEvent<Date> event) {
    	dateBox.removeStyleName("error");		
    }});

    
// Ajouter un événement associé au click sur le bouton annulerC afin de vider touts les champs      
	    annulerC.addClickHandler(new ClickHandler()
		{
			public void onClick(ClickEvent event)
			{
	        	contenu.setText("");
	        	intituleven.setText("");
	        	liste1.clear();
	        	liste2.clear();
	        	v1.clear();
	        	v2.clear();
	        	dateBox.setValue(null);
	        	x--;
	        	
	        }
	      });
	    
	    
//Ajouter un événement associé au click sur le bouton annuler afin d'annuler le patage d'événement avec d'autres enseignants
	    annuler.addClickHandler(new ClickHandler()
		{
			public void onClick(ClickEvent event)
			{
	        	vPanel.setVisible(true);
	        	vPanel3.setVisible(false);	
	        	liste1.clear();
	        	liste2.clear();
	        	v1.clear();
	        	v2.clear();
	        	x--;
	        	
	        }
	      });	    
		

	 
	   
	    
	    
	    
// Ajouter un événement associé au click sur le bouton confirmeC afin de vérifier si toute les champs sont 
// valide pour  inserer les données dans la base de données   

	    
	    

	    confirmerC.addClickHandler(new ClickHandler()
		{
			public void onClick(ClickEvent event)
			{
				if((!intituleven.getText().equals(""))&&(dateBox.getDatePicker().getValue()!=null))
				{
	        
	        	addevent();
	            if(x>0)	x--;
	        	
				}
				else
				{
			   if(intituleven.getText().equals(""))intituleven.addStyleName("error");
			   if(dateBox.getDatePicker().getValue()==null)dateBox.addStyleName("error");			
				}
	        	
	        
	        }
	      });
	    
	    
	    
	    
//Ajouter un événement associé au click sur le bouton confirmer afin de valider le partage des événements
	    
	    confirmer.addClickHandler(new ClickHandler()
		{
			public void onClick(ClickEvent event)
			{
	        
	        	vPanel.setVisible(true);
	        	vPanel3.setVisible(false);
	        
	        }
	      });
	    
	    
	    
//Ajouter un événement associé au click sur le bouton sup afin de supprimer un enseignant de la liste de partage de l'événement	

sup.addClickHandler(new ClickHandler()
{
	public void onClick(ClickEvent event)
	{
        if (liste2.getSelectedIndex()!=-1)
    	{liste1.addItem(liste2.getItemText(liste2.getSelectedIndex()));
    	v1.add(v2.elementAt(liste2.getSelectedIndex())); 
    	v2.removeElementAt(liste2.getSelectedIndex());
    	liste2.removeItem(liste2.getSelectedIndex());	
    	}
    }
  });


//Ajouter un événement associé au click sur le bouton add afin d'ajouter un enseignant à la liste de partage d'événement	

add.addClickHandler(new ClickHandler()
{
	public void onClick(ClickEvent event)
	{		
		if (liste1.getSelectedIndex()!=-1)
    	{
		liste2.addItem(liste1.getItemText(liste1.getSelectedIndex()));
    	v2.add(v1.elementAt((liste1.getSelectedIndex())));
    	v1.removeElementAt(liste1.getSelectedIndex());
    	liste1.removeItem(liste1.getSelectedIndex());
    }}
  });

onResize(); 
	}

	 /**
	 *  cette methode sert à ajouter la liste des enseignants au liste de partage
	 * 
	 */	
	
public void addselectedteacher()
{	requet ="SELECT teacher_login,teacher_name,teacher_firstname FROM teacher where teacher_login!='"+session.get("teacher_login")+"'";	
	dataBaseService.select(requet, new AsyncCallback<HashMap<String,String[]>>() {
		@Override
		public void onSuccess(HashMap<String, String[]> result) {

			
			for(int i=0;i<result.get("teacher_login").length;i++)
			{	
				
				liste1.addItem(result.get("teacher_firstname")[i].charAt(0)+"."+(result.get("teacher_name")[i]));				
				v1.add((result.get("teacher_login")[i]).toString());
				

			}				
		}
		@Override
		public void onFailure(Throwable caught) {
		
			// TODO Auto-generated method stub				
		}
	});
	
}	

/**
 * cette methode sert à transformer un BigInteger à une date au format dd/MM/yyyy
 * @param datep la date autant que Long
 * @return String qui represente la date sous format dd/MM/yyyy 
 * 
 */	

public static String BinginttoDate(Long datep)
{
	
	DateTimeFormat sdf = DateTimeFormat.getFormat("dd/MM/yyyy");
    Date d = new Date(datep);
    return sdf.format(d);
	
}

/**
 * cette methode sert à transformer une date au format dd/MM/yyyy à un BigInteger
 * @param  datep la date autant que String 
 * @return Long qui represente la date 
 * 
 */	

public static long DatetoBigint(String datep)
{
	long longDate=0;
	
	DateTimeFormat formatter ; 
    Date date1; 
    formatter =  DateTimeFormat.getFormat("dd/MM/yyyy");
    try {
		date1 = (Date)formatter.parse(datep);
		 longDate=date1.getTime();
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} 
    
      return longDate;
    }



 
/**
 * Cette méthode sert à insérer l'événement créer dans la table event,teacher_event 
 * 
 */	

public void addevent()
{  
	
DateTimeFormat fmt = DateTimeFormat.getFormat("dd/MM/yyyy");
String dateString=fmt.format(dateBox.getValue());
requet1 ="insert into event (event_name ,event_content , event_date ) values('"+intituleven.getText().trim()
+"','"+contenu.getText().trim()+"','"+Long.toString(DatetoBigint(dateString)).trim()+"')";
	    

	      dataBaseService.insert(requet1, new AsyncCallback<Integer>()
						{
							public void onSuccess(Integer result)
							{
								DateTimeFormat fmt1 = DateTimeFormat.getFormat("dd/MM/yyyy");
								String dateString1=fmt1.format(dateBox.getValue());
				             	String	requet4="select event_id from event where event_name='"+intituleven.getText().trim()+"' and event_content='"+
								contenu.getText().trim()+"' and event_date='"+Long.toString(DatetoBigint(dateString1)).trim()+"'";

								dataBaseService.select(requet4, new AsyncCallback<HashMap<String,String[]>>() {
									@Override
									public void onSuccess(HashMap<String, String[]> result) {							   															
								
								String requet3 ="insert into teacher_event (event_id ,teacher_login ) values('"+result.get("event_id")[0]+"','"+session.get("teacher_login")+"')";
								
									   
									      dataBaseService.insert(requet3, new AsyncCallback<Integer>()
														{
															public void onSuccess(Integer result)
															{
																calConsult.refrech2();	
															}
															
															public void onFailure(Throwable caught)
															{
																
															}
														});		
								
								
								
								
								for(int i=0;i<v2.size();i++)
								{  
									add_teacher_event(v2.elementAt(i),result.get("event_id")[0]);
								}			
									
								contenu.setText("");
								intituleven.setText("");
								liste1.clear();
								liste2.clear();
							    v1.clear();
							 	v2.clear();
							 	dateBox.setValue(null);		
							 			

								}
								@Override
								public void onFailure(Throwable caught) {
									
									// TODO Auto-generated method stub				
								
							}});	
								
								
								
								
							}
							
							public void onFailure(Throwable caught)
							{
								
							}
						});		
	      	
}


/**
 * cette méthode  sert à ajouter un enregistrement dans la table teacher_event
 * @param  user_id c'est l'identifiant de l'utilisateur ,event c'est l'identidiant de l'énvénement 

 * 
 */	

public void add_teacher_event(String user_id,String event)
{String requet3;
	requet3 ="insert into teacher_event (event_id ,teacher_login ) values('"+event+"','"+user_id+"')";
	
		   
		      dataBaseService.insert(requet3, new AsyncCallback<Integer>()
							{
								public void onSuccess(Integer result)
								{
									
								}
								
								public void onFailure(Throwable caught)
								{
									
								}
							});		


}
/**
 * Cette méthode retourne le conteneur de tout les composants de Calendaradd 
 * @return VerticalPanel qui représente leconteneur de tout les composants de Calendaradd
 */
public VerticalPanel get()
	 {
		 return Panel;
		 
	 }


/**
 * Cette méthode sert à redimensionner la taille de la calendaradd en fonction de la taille de la page
 */
public void onResize()
{


 dateBox.setSize(Window.getClientWidth()*2/15-110+"px",Window.getClientHeight()*2/70+"px");
 partage.setSize(Window.getClientWidth()*2/15+"px",Window.getClientHeight()*2/35+"px");
 confirmer.setSize(Window.getClientWidth()*2/15/2+"px",Window.getClientHeight()*2/35+"px");
 annuler.setSize(Window.getClientWidth()*2/15/2+"px",Window.getClientHeight()*2/35+"px");
 confirmerC.setSize(Window.getClientWidth()*2/15/2+"px",Window.getClientHeight()*2/35+"px");
 annulerC.setSize(Window.getClientWidth()*2/15/2+"px",Window.getClientHeight()*2/35+"px");
 intituleven.setSize(Window.getClientWidth()*2/12/2+"px",Window.getClientHeight()*2/70+"px");
 contenu.setSize(Window.getClientWidth()*2/15+"px",Window.getClientHeight()*2/14+"px");
 liste1.setSize(Window.getClientWidth()*2/15/2-20+"px",Window.getClientHeight()*2/10+"px");
 liste2.setSize(Window.getClientWidth()*2/15/2-20+"px",Window.getClientHeight()*2/10+"px");

}

}



